package educar.models;

import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

import educar.db.JPA;

public class Pertenece{
	private Teacher docente;
	private Facultad facultad;
	private Cargo cargo;
	private Dedicacion dedicacion;
	private static JPA jpa= new JPA();
	

	/**
	 * Metodo constructor de la relacion docente pertenece a facultad
	 * @param docente "Teacher a agregar"
	 * @param facultad "Facultad en la cual pertenece"
	 * @param cargo "Cargo que posee"
	 * @param dedicacion "Horas de dedicacion"
	 */
	public Pertenece (Teacher docente,Facultad facultad,Cargo cargo,Dedicacion dedicacion){
		setDocente(docente);
		setFacultad(facultad);
		setCargo(cargo);
		setDedicacion(dedicacion);
	}
	
	/**
	 * Obtiene el docente
	 * @return Teacher
	 */
	public Teacher getDocente() {
		return docente;
	}

	/**
	 * Establece el docente
	 * @param docente Teacher
	 */
	public void setDocente(Teacher docente) {
		this.docente = docente;
	}

	/**
	 * Obtiene la facultad
	 * @return Facultad
	 */
	public Facultad getFacultad() {
		return facultad;
	}

	/**
	 * Establece la facultad
	 * @param facultad Facultad
	 */
	public void setFacultad(Facultad facultad) {
		this.facultad = facultad;
	}

	/**
	 * Retrona el cargo del docente en la facultad
	 * @return Cargo que posee el docente
	 */
	public Cargo getCargo() {
		return cargo;
	}

	/**
	 * Establece el cargo que posee el docente
	 * @param cargo Cargo del docente
	 */
	public void setCargo(Cargo cargo) {
		this.cargo = cargo;
	}

	/**
	 * Dedicacion del docente
	 * @return hs de dedicacion en el cargo
	 */
	public Dedicacion getDedicacion() {
		return dedicacion;
	}

	
	/**
	 * Establece la dedicacion del docente
	 * @param dedicacion hs en la facultad
	 */
	public void setDedicacion(Dedicacion dedicacion) {
		this.dedicacion = dedicacion;
	}


	/**
	 * Permite guardar en la base de datos
	 * @return true o false dependiendo exito o fracaso
	 */
	public boolean save() {
		try {
			Pertenece.getPerteneceByDNIFacultad(this.getDocente().getDni(),this.getFacultad().getCod_facultad());
			return false;
		} catch (perteneceNotFound e1) {
			String[] columns = { "dni","cod_facultad","cod_cargo","hs_dedicacion" };
			PreparedStatement stm = jpa.newRecord("pertenece", columns);
			try {
				stm.setString(1, this.getDocente().getDni());
				stm.setString(2, this.getFacultad().getCod_facultad());
				stm.setString(3, this.getCargo().getCodigo());
				stm.setString(4, this.getDedicacion().getDedicacion());
			} catch (SQLException e) {
				e.printStackTrace();
				return false;
			}
			jpa.create(stm);
			return true;
		}
	}

	/**
	 * permite borrar un cargo de la base de datos
	 */
	public void destroy() {
		try {
			String[] columnas = {"cod_facultad","dni"};
			String[] valores = {this.getFacultad().getCod_facultad(),this.getDocente().getDni()};
			jpa.destroy("pertenece", columnas, valores);
		} catch (SQLException e) {
			e.printStackTrace();
		}
	}

	/**
	 * permite actualizar un cargo en la base de datos
	 * @return booleano segun exito o fracaso
	 */
	public boolean update() {
		try {
			String[] datos = {this.getDocente().getDni(),this.getFacultad().getCod_facultad(),
								this.getCargo().getCodigo(),this.getDedicacion().getDedicacion()};			
			String[] columns = { "dni","cod_facultad","cod_cargo","hs_dedicacion" };
			jpa.update("pertenece", columns, datos, "(cod_facultad,dni)", "("+this.getFacultad().getCod_facultad()+","+this.getDocente().getDni()+")");
			return true;
		} catch(Exception ex) {
			return false;
		}
	}
	
	/**
	 * retorna un objeto cargo dado el codigo del cargo
	 * @param codigo string con el codigo del cargo
	 * @return objeto Cargo
	 * @throws cargoNotFound error cargo no existe
	 */
	public static Pertenece getPerteneceByDNIFacultad(String dni,String cod_facultad) throws perteneceNotFound {
		ResultSet rs = null;
		Pertenece t = null;
		String [] columnas = {"cod_facultad","dni"};
		String [] datos = {cod_facultad,dni};
		rs = jpa.getByField("pertenece", columnas, datos);		
		try {
			if (rs.next()) {
				/*primero obtengo el cargo por las dudas que sea invalido*/
				Cargo tmp;
				try {
					tmp = Cargo.getCargoByCodigo(rs.getString(3));
				} catch (cargoNotFound e1) {
					tmp = null;
				}
				/*intento crear el nuevo pertenece*/
				try {
					t = new Pertenece(Teacher.getTeacherByDni(rs.getString(1)), Facultad.getFacultadByCodigo(rs.getString(2)),tmp,new Dedicacion(rs.getString(4)));
				} catch (NumberFormatException e) {
					e.printStackTrace();
				} catch (teacherNotFound e) {
					e.printStackTrace();
				} catch (facultadNotFound e) {
					e.printStackTrace();
				}
			} 
			else {
				throw new perteneceNotFound();
			}
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return t;
	}	
	
	
	/**
	 * Obtiene la tabla pertenece
	 * @return tabla petenece de la DB
	 */
	public static Object[][] getPerteneceTable() {
		Object[][] perteneceTable = jpa.ResultSetToArray(jpa.showAll("pertenece"));	
		for (int i=0;i<perteneceTable.length;i++) {
			try {
				perteneceTable[i][0] = Teacher.getTeacherByDni(String.valueOf(perteneceTable[i][0]));
			} catch (teacherNotFound e) {
				e.printStackTrace();
			}			
			try {
				perteneceTable[i][1] = Facultad.getFacultadByCodigo(String.valueOf(perteneceTable[i][1]));
			} catch (facultadNotFound e) {
				e.printStackTrace();
			}
			try {
				perteneceTable[i][2] = Cargo.getCargoByCodigo(String.valueOf(perteneceTable[i][2]));
			} catch (cargoNotFound e) {
				e.printStackTrace();
			}
		}
		return perteneceTable;			   
	}
	
}